# 认证模块： 注册、登录、退出登录等

from flask import render_template, Blueprint, request, flash, redirect, url_for
from app.models import User,db
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import login_user, logout_user, login_required

# 创建一个蓝图对象---蓝图的名称是“auth”
bp=Blueprint("auth",__name__)

# 实现注册功能
# rule: 请求路径---网址
# methods: 请求方法，get请求一般用于查询；post请求一般用于数据更新。
@bp.route('/register',methods=['GET','POST'])
def register():
    #如何实现注册功能？
    # request表示请求对象
    if request.method == 'POST':
        #username=request.form.get('username')
        username=request.form['username']
        password = request.form['password']
        studentId = request.form.get('student_id')
        department = request.form.get('department')
        email = request.form.get('email')
        phone = request.form.get('phone')

        # 检查表中，是否已存在该用户，如果存在则重新注册
        # select * from users where username='username'
        existUser=User.query.filter_by(username=username).first()
        if existUser:
            # 后端向前端返回提示信息
            flash('当前用户已存在')
            # return render_template('register.html')
            # 跳转方式：①.请求转发；②.重定向
            # 重定向---->auth_bp:当前蓝图对象的别名；register是函数名
            return redirect(url_for('auth.register'))

        # 密码加密.generate_password_hash()底层是基于hash算法实现的密码加密和解密。
        hashed_password=generate_password_hash(password)

        # db.session.execute()---->可以执行sql语句
        #db.session.delete()

        user=User(username=username,
                  password=hashed_password,
                  student_id=studentId,
                  department=department,
                  email=email,
                  phone=phone)
        # 添加到数据库,session表示会话
        db.session.add(user)
        # 事务提交
        db.session.commit()
        flash('注册成功')

        # auth: 当前蓝图的名称
        return redirect(url_for('auth.login'))

    return render_template('register.html')


# 编写登录逻辑
@bp.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        username=request.form.get('username')
        password = request.form.get('password')

        # 根据用户名查询一个用户
        # select * from users where username='syc'
        user=User.query.filter_by(username=username).first()
        if user and check_password_hash(user.password, password):
            # 调用flask_login中的login_user函数实现登录
            login_user(user)
            flash("登录成功")
            # 跳到首页面
            return redirect(url_for('index.index'))
        else:
            flash("用户名或密码错误")
            return redirect(url_for('auth.login'))

    return render_template('login.html')

# 退出登录--->login_required必须先登录
@bp.route('/logout')
@login_required
def logout():
    # 实现用户的退出---》把当前已登录的用户信息，从内存中清掉
    logout_user()
    flash("退出成功")
    return redirect(url_for('index.index'))